#include <iostream>

using std::cout;
using std::endl;

int test0()
{
    //如果需要查找有哪些地方用到了强制转换,C风格的写法不好查找
    int * p0 = (int*)malloc(sizeof(int));

    //int * p00 = int*(malloc(sizeof(int)));

    //void*  --->   int*
    int * p1 = static_cast<int*>(malloc(sizeof(int)));
    *p1 = 10;
    cout << "*p1:" << *p1 << endl;

    free(p1);
    p1 = NULL;

    return 0;
}

void test1()
{

    float f1 = 1.1;
    //int * p1 = static_cast<int*>(&f1);//error，提高了代码的安全性

    //该语句应该是不能转换的，而C语言没有报错，可以正常执行
    //产生一个运行时错误
    int * p2 = (int*)(&f1);
    cout << "*p2:" << *p2 << endl;
}

void func(int * p) 
{
    *p = 100;
    cout << "*p:" << *p << ", p:" << p << endl;
}

void test2()
{
    const int num = 1;//常量
    //int * p1 = &num;//error 原因是非const指针能够指向const常量，
    //后续在操作时，可以修改num的值, 而num是常量，不能修改
    //func(&num);//error 编译出错

    //const_cast是去除常量属性
    func(const_cast<int*>(&num));

    cout << "num:" << num << ", &num:" << &num << endl;
}

int main() 
{
    test2();
    return 0;
}

